import {
  getUser,
  getToken
} from '@/utils/auth'
import { useWindow } from '@/micro-app/index'

export function newWebSocket (option) {
  console.log('new webSocket.....')
  let websocket = null
  // 判断当前环境是否支持websocket
  if (useWindow().WebSocket) {
    if (!websocket) {
      // const url = `${process.env.VUE_APP_WS_BASE}/websocketProcess`
      const { host, protocol } = location
      const wsProtocol = protocol === 'http:' ? 'ws' : 'wss'
      const url = `${wsProtocol}:${host}/websocket/pc/type/cornerMark`
      const userId = getUser().userId
      websocket = new WebSocket(`${url}/${userId}/${getToken()}`)
    }
  } else {
    console.log('not support websocket')
  }
  // 连接成功建立的回调方法
  websocket.onopen = function (e) {
    // 成功建立连接后，重置心跳检测
    heartCheck.reset().start()
    console.log('connected successfully')
  }
  // 连接发生错误，连接错误时会继续尝试发起连接
  websocket.onerror = function () {
    console.log('onerror')
    newWebSocket()
  }
  // 接受到消息的回调方法
  websocket.onmessage = function (e) {
    // console.log('onmessage', e.data)
    var message = e.data
    if (message) {
      // 执行接收到消息的操作
      if (option !== undefined) {
        // 执行传入对象的方法，传出消息
        if (message !== 'ping') {
          option.onmessage(message)
        }
      }
    }
  }

  // 监听窗口事件，当窗口关闭时，主动断开websocket连接，防止连接没断开就关闭窗口，server端报错
  useWindow().onbeforeunload = () => {
    return websocket.close()
  }

  // 心跳检测, 每隔一段时间检测连接状态，如果处于连接中，就向server端主动发送消息，来重置server端与客户端的最大连接时间，如果已经断开了，发起重连。
  var heartCheck = {
    // 心跳，比server端设置的连接时间稍微小一点，在接近断开的情况下以通信的方式去重置连接时间。
    timeout: 15000,
    serverTimeoutObj: null,
    reset: function () {
      clearTimeout(this.serverTimeoutObj)
      return this
    },
    start: function () {
      this.serverTimeoutObj = setInterval(() => {
        if (websocket.readyState === 1) {
          websocket.send('ping')
        } else {
          console.log('websocket stop', websocket.readyState)
          clearTimeout(this.serverTimeoutObj)
          newWebSocket(option)
        }
      }, this.timeout)
    }
  }

  // 接受到服务端关闭连接时的回调方法
  websocket.onclose = function () {
    heartCheck.reset()
    console.log('onclose')
  }

  return websocket
}
